package cn.doitedu.day07

/**
 * scala中的泛型
 * 泛型功能：1.类型约束 2.程序更加灵活
 * scala的泛型表现形式更丰富一些（花样太多了）
 *
 */

/**
 * [T <: Comparable[T]] 上界  upper bound   <T extends Comparable<T>>
 * [T >: Comparable[T]] 下界  lower bound   <T super Comparable<T>>
 * [T <% Comparable] 视图界定   view bound
 * [T : Comparable] 上下文界定 context bound
 * [-T] 逆变   方法输入参数
 * [+T] 协变   方法返回
 *
 */

//视图界定，就是为了实现隐式转换的，必须找到一个隐式转换方法或函数
class Pair2[T <% Comparable[T]] {

  //传入两个类型一样的参数，返回大的
  def bigger(first: T, second: T): T = {
    if (first.compareTo(second) > 0) first else second
  }

}


object Pair2 {

  def main(args: Array[String]): Unit = {

    //scala中的Int没有实现了Comparable接口，运行会报错
    val p2 = new Pair2[Int]

    //1是Int类型的，没有compareTo方法
    //但是在Predef中可以找到一个隐式方法: implicit def int2Integer(x: Int): java.lang.Integer = x.asInstanceOf[java.lang.Integer]
    //被转成Integer后，就有了compareTo
    val r2: Int = p2.bigger(1, 5)
    println(r2)

    // 1 to 10
    //1是Int类型的，没有to方法
    //但是在Predef中可以找到一个隐式方法：implicit def intWrapper(x: Int): runtime.RichInt
    //被包装成RichInt后就可以调用to方法了

  }

}

